package com.hhu.wangzb.shiro.util;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.util.Arrays;

/**
 * 使用java自带的MD5算法加密，并匹配
 */
public class MD5Utils {

    private final static String HEX_NUMS_STR = "0123456789ABCDEF";

    /**
     * 将16进制字符串转换成数组
     * */
    private static byte[] hexStringToByte(String hex) {
        /* len为什么是hex.length() / 2 ?
         * 首先，hex是一个字符串，里面的内容是像16进制那样的char数组
         * 用2个16进制数字可以表示1个byte，所以要求得这些char[]可以转化成什么样的byte[]，首先可以确定的就是长度为这个char[]的一半
         */
        int len = (hex.length() / 2);
        byte[] result = new byte[len];
        char[] hexChars = hex.toCharArray();
        for (int i = 0; i < len; i++) {
            int pos = i * 2;
            result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR
                    .indexOf(hexChars[pos + 1]));
        }
        return result;
    }

    /**
     * 将数组转换成16进制字符串
     *
     * */
    private static String byteToHexString(byte[] salt){
        StringBuilder hexString = new StringBuilder();
        for (byte b : salt) {
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            hexString.append(hex.toUpperCase());
        }
        return hexString.toString();
    }

    /**
     * 密码验证 
     * @param passwd 明文密码
     * @param dbPasswd 密文密码
     */
    public static boolean validPasswd(String passwd, String dbPasswd) {
        byte[] pwIndb =  hexStringToByte(dbPasswd);

        return Arrays.equals(pwIndb, hexStringToByte(getEncryptedPwd(passwd)));
    }

    /**
     * 获得md5之后的16进制字符 
     * @param passwd 用户输入密码字符 
     * @return String md5加密后密码字符
     */
    public static String getEncryptedPwd(String passwd) {
        byte[] digest = null;
        try {
            byte[] pwd = null;
            SecureRandom sc= new SecureRandom();

            //声明摘要对象，并生成
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(passwd.getBytes(StandardCharsets.UTF_8));
            digest = md.digest();


        } catch (Exception e) {
            e.printStackTrace();
        }
        return byteToHexString(digest);
    }

    public static void main(String[] args) {
        System.out.println(getEncryptedPwd("123456"));
    }

}